Java---(三)面向对象编程基础上
一:面向对象的基本概念
1.封装性
含义:
①把对象的属性和行为看成一个密不可分的整体,把这两者"封装"在一个不可分割的对立单位中
②"信息隐蔽",把不需要外界知到的信息隐蔽起来.
2.继承性
一个类继承另一个类的属性和行为,并进行扩展.
继承分为多继承和单继承(即一个子类有多个父类和一个子类只有一个父类)目前java只支持单继承
java可以通过实现多个接口来达到多继承的目的.
3.多态性.
多态是允许程序中出现重名现象.
java分为方法重载和对象多态两种多态.
①方法重载:在一个类中允许多个方法使用同一个名字,但方法参数不同(个数或类型)
②对象多态:子类对象可以和父类对象进行相互转换,并且根据其使用的子类完成不同的功能.
二对象的创建与引用
类名 对象名称 = null; //声明对象
对象名称 = new 类名(); //实例化对象,只要用new就表示开辟新的堆内存空间
注意:对象使用前一定要先实例化(new)
传递引用
①per2 其实指向的是per1的堆内存,所以当per2对其修改时,per1也会收到影响
Person per1 = new Person("zhangsan",12); Person per2 = per1;
②per2和per1虽然信息完全相同,但实质上指向的不是同一个堆内存,所以对per2进行修改,不会影响到per1.
Person per1 = new Person("zhangsan",12); Person per2 = new Person("zhangsan",12);
垃圾回收机制
Person per1 = new Person("zhangsan",12); Person per2 = new Person("lisi",22); per2 = per1;
堆内存中的空间在没有被任何内存引用时会被GC(垃圾回收机制Garbage Collection)释放.
三.封装性
类中的属性都使用private来修饰,使外部不能访问(private修饰的属性和方法只能在其内部被调用,不能再外部调用)
外部只能使用setter,getter来获取和修改属性.
class Person{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
this.xxx 表示调用当前类中的属性或者方法
四.构造方法
构造方法没有返回值
访问权限 类名称 (类型1 参数1,类型2 参数2){
程序语句
//无返回值
}
注意:构造方法与类名称相同
①方法声明处没有返回值类型
②不能使用return返回一个值
③类一定有构造方法,当不声明时,程序默认有一个无参构造方法,但如果声明了一个构造方法后,程序默认的无参构造会消失.
④构造函数也可以进行方法的重载
class Person{ private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public Person() { } }
五.匿名对象
1.匿名对象只在堆内存中开辟空间,不存在栈内存的引用
匿名对象一般只使用一次.(用来直接调用方法),因为没有然后栈内存引用此处的堆内存,这个对象会在使用后被GC垃圾回收机制回收.
六.String类
1.String类的初始化
String类可以直接初始化 String name = "sy";
也可以通过其构造方法初始化 String name = new String("sy");
注:String类还存在一个构造方法 String name = new String("sy".getBytes("字符集"),"目标字符集");
例如:
uname = new String(uname.getBytes("iso8859-1"),"utf-8");
将uname字符串从iso8859-1编码转成utf-8编码.
2.String的比较
直接使用 字符串 == 字符串 实际比较的是两个字符串的地址,只有当堆内存相同时才会放回相等
如果要判断内容是否相同,一般使用 字符串.eqauls(String str);
注:String类采用的设计模式其实是共享设计模式
即当两个字符串采用直接赋值的方式定义了两个字符串,jvm不会再开辟新的内存空间
面试题:解释String类的两种对象实例化方式的区别
答:(1).直接赋值(String str = "字符串';): 只会开辟一块堆内存空间,并且会自动保存到对象池中,供下次重复使用
(2).构造方法(String str = new String("字符串")) 会开辟两个堆内存空间(匿名字符串一个,str一个)但实际使用的只有一共空间,并且不会自动入池,手动入池的方法是(inter());
3.字符串内容不会改变.只会不断更换栈内存中指向堆内存的地址
注:在实际操作中当遇到需要对字符串进行频繁修改时可以使用StringBuffer类来定义字符串.
4.String的常用方法
见p111
5.引用传递
String str1 = "hello"; System.out.println("fun()方法调用前"+str1); fun(str1); System.out.println("fun()方法调用后"+str1); } public static void fun(String str2){ str2 = "MLDN"; }
六.This关键字
this的作用
(1).表示类中的属性
(2).可以使用this调用本类的构造方法
(3).this表示当前对象
注:this.() 调用的是当前对象的无参构造方法
七.两个对象比较
进行对象比较时应从对象的方法中出发通用的对象比较代码,覆写equals方法
①.优先比较地址
②.确认传入对象是否为null
③.对对象的属性进行比较
public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Person)) return false; Person person = (Person) o; return age == person.age && Double.compare(person.high, high) == 0 && Objects.equals(name, person.name); }
八.static关键字
1.static声明的属性为全局属性,所有对象共享.(当static修饰的属性发生改变时,所有对象的此属性都会改变)
2.一般修改static属性都采用类名.属性调用,而不是用对象调用来修改
3.static修饰的方法也是通过类名直接调用的.
关于static方法定义的说明:(一般定义方法都不采用static定义方法)
①本类中没有提供有普通属性(这种类只是为了使用方法)
②本类无法直接进行对象实例化,只能够利用static操作.
4.static修饰的方法和属性可以被其他类调用,但static修饰的方法只能调用static修饰的类和方法.
原因:在程序中所有的属性和方法必须在对象实例化(即开辟堆内存)之后才能被调用,但static类型的方法在未被实例化时可以通过类名调用.
九.理解main方法
main方法中的参数 String args[] 实际时在终端运行程序时传入的参数.
十.代码块
一共分为四种代码块 ①普通代码块 ②构造块 ③静态代码块 ④同步代码块
①.直接对代码进行分割,,外部和内部的重名变量不影响
public static void main(String[] args) { { int x = 20; System.out.println(x); } int x = 10; System.out.println(x); }
②构造块 是写在类中的,在每次实例化对象时都会先于构造方法执行.
public class Person { String name; int age; double high; { System.out.println("1.构造块"); } public Person() { System.out.println("2.构造方法"); } }
③静态代码块 在主方法类中定义的静态代码块会先于主方法执行,在类中定义的静态代码块会先于构造方法执行,且只执行一次.
注:在jdk1.7之前可以在主方法类中使用static完成主方法的操作后直接退出程序,1.7之后不能.
static{ System.out.println("hello"); } public static void main(String[] args) { System.out.println("word"); }

浙公网安备 33010602011771号