java对象
构造器详解
-
构造的特点
- 与类的名字相同
- 没有返回值
-
无参构造,默认的
-
有参构造
创建对象内存分析
java封装
-
将变量设置为private,不可以被访问
-
将方法设置为public,可以由外部调用
-
command+N:可以自动生成set和get方法
-
属性私有,get/set
继承
-
父类
-
子类
-
/* 子类继承父类的所有public元素 public protexted default */ public class Person { } public class Student extend Person { }
-
一个子类只能有一个父类
-
object类,所有类的父类
Super详解
-
super可以调用父类的构造方法
-
super必须只能出现在子类的方法或构造方法中
-
super和this不能够同时调用构造方法
-
私有的东西还是无法被访问
-
默认调用父类的无参构造
public class Person { public Person() { System.out.println("Person调用"); } } public class Student extend Person { public Student() { System.out.println("Student调用"); } } //在new了Student后,先输出"Person调用",再输出"Student调用"
-
this():子类的构造
-
super():父类的构造
方法的重写
- 静态方法与非静态方法区别很大
public class B {
public static void test()
{
System.out.println("B");
}
}
public class A extends B {
public static void test()
{
System.out.println("A");
}
}
public class Main {
public static void main(String[] args) {
A a=new A();
a.test();
B b=new B();
b.test();
}
}
/*输出
A
B
*/
public class B {
public void test()
{
System.out.println("B");
}
}
public class A extends B {
public void test()
{
System.out.println("A");
}
}
public class Main {
public static void main(String[] args) {
A a=new A();
a.test();
B b=new B();
b.test();
}
}
/*输出
A
A
*/
-
只有子类重写父类的方法,才能说重写
-
重写
需要有继承关系,子类重写父类的方法
- 方法名相同
- 参数列表必须相同
- 修饰符:范围可以扩大:public>protected>default(默认)>private
- 抛出异常:范围可以被缩小,但不能扩大
-
为什么要重写
父类的一些功能不满足子类的需求
多态
-
同样的一个方法名,可以根据不同的对象(父类,子类),运行不同的方法
-
必须要有重写,才能有多态
-
子类重写父类,调用子类;没有重写,调用父类
-
Student s1=new Student(); Person s2=new Person(); /* 父类可以指向子类,但是不可以调用子类特有的方法 */
-
注意事项:
- 多态是方法的多态,属性没有多态
- 子类和父类,有联系
- 存在条件:继承关系,方法需要重写,父类引用指向子类对象!Father f1=new Son();
instanceof和类型转换
-
有继承关系,instanceof才有用
-
/* 用super详解中的例子 */ Student student=new Student(); System.out.println(student instanceof Student); System.out.println(student instanceof Person); System.out.println(student instanceof Object); /* 返回值都是true,当Student,Person,Object换成其他没有继承关系的,返回的都是false */
-
类型转换
子类转换为父类,可能丢失自己本来的一些方法。
把指向父类,而定义为子类的对象。强制转换为子类的对象。
public class B { public void test() { System.out.println("B"); } } public class A extends B { public void test() { System.out.println("A"); } public void hh() { System.out.println("hello"); } } public class Main { public static void main(String[] args) { B b=new A(); //b.hh();//A ((A) b).hh();//B } } //A处不可执行 //B处可以执行
-
总结
- 父类引用指向子类对象
- 把子类转换为父类,向上转型
- 把父类转换为子类,向下转型,强制转换