2018-12-03笔记
构造方法只可以在创建对象时调用,用于初始化对象;
在普通成员方法里面不可以this(“张三”);但是可以this.study();
super关键字代表父类对象;
在创建子类对象时,父类的构造方法会先执行,因为子类中所有构造方法的第一行有默认的隐式super();语句;
Super()父类构造方法
Super.study()父类中的study方法
Super.name父类对象中的name属性
在子类的构造方法中第一行默认有一个super(),默认调用父类的空参构造方法;
//不写也有,写也有
Super()必须要写在构造方法第一行;
为什么子类对象创建都要访问父类中的构造方法?因为子类继承了父类的内容,所以创建对象时,必须要先看父类是如何对其内容进行初始化的;
//初始化和清理,这里的作用就是初始化父类对象;
无论到哪儿,子类的构造方法都会有一个super(),用来初始化父类对象,所以在创建类时,务必要提供一个无参构造方法;
//如果父类没有无参构造,只有有参构造,那么super(传入实参);传入实参的super构造器也是可以的;
//只是走一下父类的构造方法;
//对父类的内容初始化;
那么,子类中的构造方法为什么会有一句隐式的super()呢?
原因:子类会继承父类中的内容,所以子类在初始化时,必须先到父类中去执行父类的初始化动作。这样,才可以使用父类中的内容。
当父类中没有空参数构造方法时,子类的构造方法必须有显示的super语句,指定要访问的父类有参数构造方法;
如果子类的构造方法第一行写了this调用了本类其他构造方法,那么super调用父类的语句还有吗?
这时是没有的,因为this()或者super(),只能定义在构造方法的第一行,因为初始化动作要先执行;
this和super关键字在构造方法中,只能在第一行,所以使用了this关键字之后,super就不存在了;
只要子类构造方法能够直接或者间接调用父类构造方法(无餐/有参)即可;
this()和super()只能写在构造方法中,在普通方法不可以有this()和super(),因为这两个是初始化对象的构造方法,只可以在创建对象时使用;在普通方法中使用this和super关键字则没有必须在第一行的要求,只有this()和super()这种形式要求必须在第一行;
父类构造方法中是否有隐式的super呢?
也是有的。记住:只要是构造方法默认第一行都是super();
父类的父类是谁呢?super调用的到底是谁的构造方法呢?
Java体系在设计,定义了一个所有对象的父类Object
类中的构造方法默认第一行都有隐式的super()语句,在访问父类中的空参数构造方法。所以父类的构造方法既可以给自己的对象初始化,也可以给自己的子类对象初始化。
如果默认的隐式super()语句在父类中没有对应的构造方法,那么必须在构造方法中通过this或者super的形式明确要调用的构造方法。
this功能:
① 调用本类的成员变量和成员方法
② 区分成员变量和局部变量同名问题
③ 在构造方法中调用其他构造方法
Final用法:修饰类,类的成员,以及局部变量;不能修饰构造方法!
final修饰类不可以被继承,但是可以继承其他类!
final修饰的方法不可以被子类重写,但父类中没有被final修饰方法,子类重写后可以加final;
final修饰的变量称为常量,这些变量只能赋值一次,而且终身不变;
final修饰局部变量(基本数据类型),一旦赋值终身不变;
//静态常量才会变成蓝色(static final)
final修饰局部变量(引用数据类型),一旦赋值一个地址终身不变;
final修饰成员变量,需要在创建对象前初始化,负责报错;成员变量进堆,会给一个默认值,不手动赋值就没有意义了;要么手动赋值,要么构造方法赋值,只要在创建对象之前赋值就没问题,注意:SET方法是不可以的!!!
package com.oracle.demo04;
public class Person {
//声明了常量之后,要么手动附初值,要么在构造方法中赋值,不可以在SET方法中赋值,因为常量要在创建对象分配地址之前赋值;
final String name;
public Person(String name){
this.name=name;
}
}
package com.oracle.demo01;
public class Student {
private String name;
private static String Schoolname;
public Student(){
super();
}
public Student(String name, String schoolname) {
super();
this.name = name;
Schoolname = schoolname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSchoolname() {
return Schoolname;
}
public void setSchoolname(String schoolname) {
Schoolname = schoolname;
}
}
package com.oracle.demo01;
public class Test {
public static void main(String[] args) {
Student s1=new Student("小红","清华大学");
Student s2=new Student("小明","清华大学");
Student s3=new Student("小亮","清华大学");
s2.setSchoolname("北京大学");
System.out.println(s1.getSchoolname()+"……"+s2.getSchoolname()+"……"+s3.getSchoolname());
}
}
/*
* 1.加载Test.class和Student.class
*
* 2.加载main方法和private static String Schoolname;进入方法与数据共享区(静态区)
*
* 3.main方法进栈,执行内容
*
* 4.new的对象进堆,由于Schoolname已经进入静态取,所以堆内只有String name
*
* 5.执行对象的构造方法,将小红赋值给堆中的String name,静态区中的Schoolname被赋值成清华大学
*
* 6.几个对象都是这个流程,最后把对象s2的学校改为北京大学,由于所有Student对象都指向这个静态区,所以所有对象都的Schoolname都变为北京大学了
*
* */
被static修饰的成员变量属于类,不属于这个类的某个对象(也就是说,多个对象在访问或修改static修饰的成员变量时,其中一个对象将static成员变量值进行了修改,其他对象中的static成员变量值跟着改变,即多个对象共享同一个static成员变量);
被static修饰的成员可以并且建议通过类名直接访问;
静态内容是优先于对象存在,只能访问静态,不能使用this/super(本类对象/父类对象);静态修饰的内容存于静态区;
同一个类中,静态成员只能访问静态成员(因为静态成员是和main方法一起出现的,静态成员出现的时候,普通成员还没出现);
main方法为静态方法仅仅为程序执行入口,它不属于任何一个对象,可以定义在任意类中;
非静态成员可以访问静态成员,静态成员不可以访问非静态成员;
静态&多态:
package com.oracle.demo02;
public class Fu {
static int i=1;
public static void f(){
System.out.println("这是父类静态方法");
}
}
package com.oracle.demo02;
public class Zi extends Fu{
static int i=2;
public static void f(){
System.out.println("这是子类重写后的方法");
}
}
package com.oracle.demo02;
public class Test {
public static void main(String[] args) {
Fu f=new Zi();
System.out.println(f.i);
f.f();
//多态特殊点:子类对象交给父类引用,此时静态成员变量和静态成员方法,都是调用父类的,因为此时成员变量和成员方法都属于类不属于对象
}
}
使用public static final修饰的变量来定义静态常量;
定义格式:
public static final 数据类型 变量名 = 值;
接口中的每个成员变量都默认使用public static final修饰;
所有接口中的成员变量已是静态常量,由于接口没有构造方法,所以必须显示赋值,可以直接用接口名访问;
//当final修饰的成员变量必须在创建对象之前赋值,要么直接附初值要么用构造方法赋值;
匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量;
//没有引用;
① 创建匿名对象直接使用,没有引用变量;
new Person().eat()
② 匿名对象在没有指定其引用变量时,只能使用一次;
new Person().eat()和new Person().eat()不是相同的对象;
③ 匿名对象可以作为方法接收的参数,方法返回值使用;(作为实参传入某个方法,或者作为返回值使用)
什么是内部类
将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称为内部类。其他类也称为外部类;
什么时候使用内部类
在描述事物时,若一个事物内部还包含其他可能包含的事物,比如在描述汽车时,汽车中还包含这发动机,这时发动机就可以使用内部类来描述;
① 成员内部类:在成员位置
② 局部内部类:在方法中
内部类的分类:
内部类分为成员内部类与局部内部类。
我们定义内部类时,就是一个正常定义类的过程,同样包含各种修饰符,继承与实现关系等;在内部类中可以直接访问外部类的所有成员;
成员内部类,定义在外部类中的成员位置。与类中的成员变量相似,可通过外部类对象进行访问
定义格式
class 外部类 {
修饰符 class 内部类 {
//其他代码
}
}
访问方式
外部类名.内部类名 变量名 = new 外部类名().new 内部类名();
package com.oracle.demo04;
public class Outer {
int i=0;
//成员内部类
class inner{
int i=2;
public void show(){
int i=1;
//1.成员内部类的成员方法,访问内部类中的成员变量,使用this关键字
//2.成员内部类的成员方法,访问外部类中的成员变量,使用外部类类名.this.成员变量名
Outer.this.show();
System.out.println(Outer.this.i);
}
}
public void show(){
System.out.println("这是外部类成员方法");
}
}
package com.oracle.demo04;
public class Test {
public static void main(String[] args) {
//创建Outer中成员内部类inner的对象,然后调用成员内部类的方法:
Outer.inner inn=new Outer().new inner();
inn.show();
}
}
局部内部类:
局部内部类,定义在外部类方法中的局部位置。与访问方法中的局部变量相似,可通过调用方法进行访问
定义格式
class 外部类 {
修饰符 返回值类型 方法名(参数) {
class 内部类 {
//其他代码
}
}
}
访问方式
在外部类方法中,创建内部类对象,进行访问
package com.oracle.demo05;
public class Outer {
public void show(){
class Inner{
public void show2(){
System.out.println("这是局部内部类的方法");
}
}
//局部内部类只能在创建类的方法内创建对象,然后调用方法,然后早main方法中创建外部类的对象,调用存在局部内部类的外部类的成员方法;
Inner in=new Inner();
in.show2();
}
}
package com.oracle.demo05;
public class Test {
public static void main(String[] args) {
Outer out=new Outer();
out.show();
}
}
posted on 2018-12-07 11:01 Postgre叮当牛i 阅读(114) 评论(0) 编辑 收藏 举报