面向对象 继承 抽象类 接口 static 权限修饰符

Day01 面向对象 继承 抽象类 接口 static

1.匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量。

2.类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。

父类抽取出了共性的内容,子类可以在父类基础上扩展新的属性与行为。

子类拥有父类的所有属性与方法,无需重新定义。并且可以直接使用非私有的父类成员。

1.1 -子类中访问父类成员方法特点

l 子父类中成员方法的特点

当在程序中通过对象调用方法时,会先在子类中查找有没有对应的方法,若子类中存在就会执行子类中的方法,若子类中不存在就会执行父类中相应的方法

_面向对象_构造方法

1).任何的类中都有构造方法,如果我们不定义,系统会自动添加一个

   默认(公有、无参、什么都不做的)构造方法。

class Student{

public Student(){

}

}

2).每次"创建对象"时,都会自动执行"构造方法"

3).构造方法的作用:初始化成员属性;

4).构造方法的定义格式:

访问修饰符 构造方法名(同类名)(形参){

}

Super关键字:::当子父类中出现了同名成员变量时,在子类中若要访问父类中的成员变量,必须使用关键字super来完成。

一般的访问不需要使用this关键字,但有些情况必须使用:

1).在某个方法内,局部变量覆盖了成员变量,此时要访问别覆盖的成员变量,

   必须使用:this.成员变量名

class Student{

String name;

public void setName(String name){

this.name = name;

}

}

_面向对象_this关键字

1).this是每个类中都有的一个成员变量,由编译器自动添加的;

2).每当创建一个对象时,JVM会自动将这个对象的"引用"赋值给这个this变量;

3).它表示:引用当前对象的.....(成员属性、成员方法等)

   也就是,通过this可以访问"当前对象""成员"

class Student{

private String name;

public void setName(String name){

this.name = name;

}

public void getName(){

return this.name;//表示:当前对象的,name成员属性

}

}

6.1.charAt(int index):获取这个字符串中某个索引位置上的字符

5.boolean endsWith(String str):判断当前字符串是否以str结尾;

6.int indexOf(String str):查找str在当前字符串中的位置。如果没找到,返回-1

注意:以上对字符串操作的所有方法,都不能改变原字符串,都是生成一个新的字符串;

  1. 在每次创建子类对象时,父类的class文件也会进入内存中。目的在于子类对象中包含了其对应的父类存储空间,便可以包含其父类对象的成员,如果父类成员非private修饰,则子类可以随意使用父类成员。

代码体现在子类的构造方法调用时,一定先调用父类的构造方法。

1.2 8.抽象类&抽象方法的使用

抽象类无法直接创建对象,只能被子类继承后,创建子类对象。

子类需要继承抽象父类并完成最终的方法实现细节(即重写方法,完成方法体)。而此时,方法重写不再是加强父类方法功能,而是父类没有具体实现,子类完成了具体实现,我们将这种方法重写也叫做实现方法。

1.3 抽象类常见疑惑

l 抽象类一定是个父类,因为抽象类时不断抽取共性需求而来的。

l 抽象类中是可以不定义抽象方法的,此时仅仅是不让该类创建对象,用于某些特殊的设计需要。

l 设计时由具体类抽取出抽象类,而开发阶段应该先定义抽象父类,再根据不同需求由父类定义子类。

l  }

l 03.面向对象_继承_thissuper关键字

l  1).this:

l  1).任何类中都有一个this成员变量;

l  2).当创建对象时,由JVM为其赋值,赋值为当前对象的引用;

l  3).通过this可以访问本类的成员属性、成员方法、构造方法;

l  2).super:

l  1).任何类中都有一个super成员变量;

l  2).当创建对象时,由JVM为其赋值,赋值为父类对象的引用;

l  3).通过super,可以访问父类中的成员变量、成员方法、构造方法;

8.面向对象_继承_子类覆盖父类的成员方法(方法重写)

1).有时候,子类需要保留父类的功能(方法名),但需要做不同的事情。

   这时,子类就可以定义一个跟父类那个方法"一模一样"的方法,用来覆盖父类中的原方法。

   这种形式就叫:方法的重写

2).重写规则:

1).子类方法的"访问修饰符"必须跟父类相同,或者比父类更宽;

从宽到窄:public,protected,(默认)

2).子类方法的:返回值类型,方法名,形参列表必须与父类方法完全相同

3).可以使用@Override强制重写验证;Eclipse会按照重写的语法规则检查你的方法。

3).重写的注意事项:

1).父类的"私有方法"由于不能被继承,所以谈不上被重写;

2).静态方法不能被重写;

4).重写的作用:

保留了父类的功能(相同的方法名),而且实现了子类特有的行为(子类方法内特有的行为)

1.

接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定义与实现分离,优化了程序设计。

1.4 2.接口中成员的特点

1、接口中可以定义变量,但是变量必须有固定的修饰符修饰,public static final 所以接口中的变量也称之为常量,其值不能改变。后面我们会讲解staticfinal关键字

2、接口中可以定义方法,方法也有固定的修饰符,public abstract

3、接口不可以创建对象。

4、子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽象类。

5.由于犬分为很多种类,他们吼叫和吃饭的方式不一样,在描述的时候不能具体化,也就是吼叫和吃饭的行为不能明确。当描述行为时,行为的具体动作不能明确,这时,可以将这个行为写为抽象行为,那么这个类也就是抽象类。

可是当缉毒犬有其他额外功能时,而这个功能并不在这个事物的体系中。这时可以让缉毒犬具备犬科自身特点的同时也有其他额外功能,可以将这个额外功能定义接口中。

6.相同点:

都位于继承的顶端,用于被其他类实现或继承;

都不能直接实例化对象;

都包含抽象方法,其子类都必须覆写这些抽象方法;

区别:

抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性;接口只能包含抽象方法;

一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)

抽象类为继承体系中的共性内容,接口为继承体系中的扩展功能

二者的选用:

优先选用接口,尽量少用抽象类;

需要定义子类的行为,又要为子类提供共性功能时才选用抽象类;

3.父类引用指向子类对象就是多态的定义格式。同一个父类的方法会被不同的子类重写为各自的具体实现。在调用方法时,调用的为各个子类重写后的方法。

父类类型  变量名 = new 子类类型();

变量名.方法名();

此时,虽然该变量指向的是子类对象,但表现为一个父类的形态,可以调用一切父类的方法,子类特有的方法将不能调用。

1.5 多态调用注意事项

成员变量编译看父类中是否存在,不存在编译失败

l 成员变量运行父类中的变量

成员方法编译看父类中是否存在,不存在编译失败

l 成员方法运行子类重写的方法

  多态的弊端: 不能调用子类的特有方法

.面向对象_多态_多态中成员的访问_总结

1.多态时,访问的任何成员,在父类中必须存在;否则编译错误(不能访问子类特有成员)

2.多态时,访问被子类覆盖的成员属性--访问的是父类的 编译看左边,运行看左边 Person p = new Student();

System.out.println(p.num1);

  多态时,访问被子类重写的成员方法--访问的是子类的      编译看左边,运行看右边 Person p = new Student();

p.show();//访问的是子类的

  多态时,访问的静态方法--访问的是父类的 编译看左边,运行看左边

1.6 static特点

static是静态修饰符,一般修饰成员。static修饰的成员属于类,不属于单个这个类的某个对象

static修饰的成员被多个对象共享。

static修饰的成员属于类,但是会影响每一个对象。

static修饰的成员又叫类成员,不叫对象的成员。

1.7 2.静态代码块

静态代码块是定义在成员位置,使用static修饰的代码块。

特点:

l 它优先于主方法执行、优先于构造代码块执行,当以任意形式第一次使用到该类时执行。

l 该类不管创建多少对象,静态代码块只执行一次。

l 可用于给静态变量赋值,用来给类进行初始化。

public class Person {

private String name;

private int age;

 //静态代码块

static{

System.out.println("静态代码块执行了");

}

}

四种访问权限修饰符

要想仅能在本类中访问使用private修饰;

l 要想本包中的类都可以访问不加修饰符即可;

要想本包中的类与其他包中的子类可以访问使用protected修饰

要想所有包中的所有类都可以访问使用public修饰。

注意:如果类用public修饰,则类名必须与文件名相同。一个文件中只能有一个public修饰的类。

3.

04.面向对象_static关键字_注意实现_静态代码块00000000000000000000000000000000000000000000000

1).static关键字的注意事项:

1).一个类中的"静态成员""普通成员"分配内存空间的时机是不一样的。

   "静态成员"无论任何情况下,都比"普通成员"先分配内存。

   "静态成员"是在"第一次使用这个类"的时候,就会被分配空间。

2).在静态的方法内,不能直接访问"非静态成员";只能访问"静态成员"

   在普通的方法内,可以访问静态成员和普通成员;

3).在静态方法内,不能使用thissuper关键字;(thissuper是在创建对象时,JVM才会为其赋值)

2).静态成员如果使用"构造方法"初始化有些晚了。

   可以使用静态代码块为静态成员属性初始化。

3).静态代码块是定义在"类体中"

class Student{

static String schoolName;

static{

schoolName = "传智播客北京校区";

}

}

4).静态代码块只在"第一次使用这个类"的时候被执行一次,之后再也不会被执行了。

5).静态代码块的作用:初始化静态成员;

4.

一个问题:abstract关键字不能和哪些关键字共存?

1).final : 因为final类不能被继承,而abstract类就是被继承的;方法也是一样;所以冲突;

2).private : abstract方法就是被子类重写的。private的方法不能被继承,也就不能被重写,所以冲突;

3).static : static方法第一次使用这个类时就要被分配空间,abstract的方法没有方法体,无法被分配空间;所以冲突;

另一个问题:当对于"成员变量",如果被修饰为static,很有可能也需要被修饰为final

class Student{

static final String schoolName = "传智播客北京校区";

}

1.8 Day04面向对象

这时就会想,那么我们能不能不创建对象,就可以调用方法呢?

static是静态修饰符,一般修饰成员。static修饰的成员属于类,不属于单个这个类的某个对象

static修饰的成员被多个对象共享。

static修饰的成员属于类,但是会影响每一个对象。

static修饰的成员又叫类成员,不叫对象的成员。

2.静态代码块是定义在成员位置,使用static修饰的代码块。

特点:

l 它优先于主方法执行、优先于构造代码块执行,当以任意形式第一次使用到该类时执行。

l 该类不管创建多少对象,静态代码块只执行一次。

l 可用于给静态变量赋值,用来给类进行初始化。

l 3.要想仅能在本类中访问使用private修饰;

l 要想本包中的类都可以访问不加修饰符即可;

要想本包中的类与其他包中的子类可以访问使用protected修饰

要想所有包中的所有类都可以访问使用public修饰。

注意:如果类用public修饰,则类名必须与文件名相同。一个文件中只能有一个public修饰的类。

 

 

所以多态的存在意义(优点)为:

配合继承与方法重写提高了代码的复用性与扩展性,如果没有方法重写,则多态同样没有意义。

    多态的弊端: 不能调用子类的特有方法

 

  1. String str =new String(“hello”)  上面语句中变量str放在栈上, new创建出来的字符串对象放在堆上,hello 这个字面量是放在方法区的

猜你喜欢

转载自www.cnblogs.com/shan1393/p/8944879.html
今日推荐