Java继承格式代码演示_Java编程基础09——面向对象_代码块&继承&方法&final

1.代码块的概述和分类(了解)(实际不用)

A:代码块概述

在Java中,使用{}括起来的代码被称为代码块。

B:代码块分类

根据其位置和声明的不同,可以分为局部(方法中)代码块,构造代码块,静态代码块,同步代码块(多线程讲解)。

C:常见代码块的应用

a:局部代码块

在方法中出现;限定变量生命周期,及早释放,提高内存利用率

b:构造代码块 (初始化块)

在类中方法外出现;多个构造方法方法中相同的代码存放到一起,每创建一次对象就会执行一次,优先于构造函数执行。每次调用构造都执行,并且在构造方法前执行

c:静态代码块

在类中方法外出现,并加上static修饰;用于给类进行初始化,随着类加载而加载,一般用来给类进行初始化,在加载的时候就执行,并且只执行一次。

一般用于加载驱动,优先于主方法执行。

案例展示

class Noname1 {

public static void main(String [] args) {

{

int x = 10; //局部代码块限定变量的声明周期

System.out.println(x);

}

Student s1 = new Student();

System.out.println("----------------");

Student s2 = new Student("张三",23);

System.out.println("----------------");

Student s3 = new Student("李四",24);

System.out.println("----------------");

Student s4 = new Student("王五",25);

}

static {

System.out.println("我是在主方法中的代码块");

}

}

class Student {

private String name;

private int age;

public Student(){

System.out.println("空参构造");

study();

} //空参构造

public Student(String name,int age){

this.name = name;

this.age = age;

System.out.println("you参构造");

study();

}

public void setName(String name) {

this.name = name;

}

public String getName(){

return name;

}

public void setAge(int age) {

this.age = age;

}

public int getAge(){

return age;

}

{

study();

}

public void study() {

System.out.println("好好学习");

}

static {

System.out.println("我是静态代码块");

}

}

2.代码块的面试题(掌握)

A:看程序写结果

class Student {

static {

System.out.println("Student 静态代码块");

}

{

System.out.println("Student 构造代码块");

}

public Student() {

System.out.println("Student 构造方法");

}

}

class Demo2_Student {

static {

System.out.println("Demo2_Student静态代码块");

}

public static void main(String[] args) {

System.out.println("我是main方法");

Student s1 = new Student();

Student s2 = new Student();

}

}

3.继承案例演示(掌握)

A:继承(extends)

让类与类之间产生关系,子父类关系

B:继承案例演示:

动物类,猫类,狗类

定义两个属性(颜色,腿的个数)两个功能(吃饭,睡觉)

C:案例演示

使用继承前

D:案例演示

使用继承后

class JavaObject {

public static void main(String[] args) {

Cat c = new Cat();

c.color = "花";

c.leg = 4;

c.eat();

c.sleep();

System.out.println(c.leg + "..." + c.color);

}

}

class Animal {

String color;

int leg;

public void eat() {

System.out.println("吃饭");

}

public void sleep() {

System.out.println("睡觉");

}

}

class Cat extends Animal{

}

class Dog extends Animal{

}

4.继承的好处和弊端(掌握)

A:继承的好处

a:提高了代码的复用性

b:提高了代码的维护性

c:让类与类之间产生了关系,是多态的前提

B:继承的弊端

类的耦合性增强了。

开发的原则:高内聚,低耦合。

耦合:类与类的关系

内聚:就是自己完成某件事情的能力

5.Java中类的继承特点(掌握)

A:Java中类的继承特点

a:Java只支持单继承,不支持多继承。(一个儿子只能有一个爹)

有些语言是支持多继承,格式:extends 类1,类2,...

b:Java支持多层继承(继承体系)

B:案例演示

Java中类的继承特点

如果想用这个体系的所有功能用最底层的类创建对象

如果想看这个体系的共性功能,看最顶层的类

C:继承的注意事项

a:子类只能继承父类所有非私有的成员(成员方法和成员变量)**

b:子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。

c:不要为了部分功能而去继承

项目经理 姓名 工号 工资 奖金

程序员 姓名 工号 工资

D:什么时候使用继承

继承其实体现的是一种关系:"is a"。

Person:Student、Teacher

水果:苹果、香蕉、橘子

采用假设法。

如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。

class JavaObject {

public static void main(String[] args) {

DemoC c = new DemoC();

c.show();

c.method();

c.print();

}

}

class DemoA {

public void show() {

System.out.println("吃饭");

}

}

class DemoB extends DemoA{

public void method() {

System.out.println("睡觉");

}

}

class DemoC extends DemoB{

public void print() {

System.out.println("打豆豆");

}

}

6.this和super的区别和应用(掌握)

A:继承中成员变量的关系案例演示

a:不同名的变量

b:同名的变量

B:this和super都代表什么

this:代表当前对象的引用,谁来调用我,我就代表谁

super:代表当前对象父类的引用

C:this和super的使用区别

a:调用成员变量

this.成员变量 调用本类的成员变量,也可以调用父类的成员变量

super.成员变量 调用父类的成员变量

b:调用构造方法

this(...) 调用本类的构造方法

super(...) 调用父类的构造方法

c:调用成员方法

this.成员方法 调用本类的成员方法,也可以调用父类的方法

super.成员方法 调用父类的成员方法

class JavaObject {

public static void main(String[] args) {

Son s = new Son();

s.print();

}

}

class Father {

int num1 = 10;

int num2 = 30;

}

class Son extends Father {

int num2 = 20;

public void print() {

System.out.println(this.num1);

System.out.println(this.num2); //就近原则,子类有就不用父类了

System.out.println(super.num2);

}

}

7.继承中构造方法的关系(掌握)

A:案例演示

子类中所有的构造方法默认都会访问父类中空参数的构造方法

B:为什么呢?

因为子类会继承父类中的数据,可能还会使用父类的数据。

所以,子类初始化之前,一定要先完成父类数据的初始化。

其实:

每一个构造方法的第一条语句默认都是:super() Object类最顶层的父类。

class JavaObject {

public static void main(String[] args) {

Son s = new Son();

}

}

class Father {

public Father() {

super();//默认继承object类。

System.out.println("Father的构造方法");

}

}

class Son extends Father {

super(); //这是一条隐藏语句,用来访问父类中的空参构造。

public Son() {

System.out.println("Son的构造方法");

}

8.继承中构造方法的注意事项(掌握)

A:案例演示

父类没有无参构造方法,子类怎么办?

super解决

this解决

B:注意事项

super(…)或者this(….)必须出现在构造方法的第一条语句上

class JavaObject {

public static void main(String[] args) {

Son s = new Son();

System.out.println(s.getName() + "..." + s.getAge());

System.out.println("---------------------------");

Son s2 = new Son("张三",23);

System.out.println(s2.getName() + "..." + s2.getAge());

}

}

class Father {

private String name;

private int age;

/*public Father() { //空参构造

System.out.println("Father空参构造");

}*/

public Father(String name,int age) {

this.name = name;

this.age = age;

System.out.println("Father有参构造");

}

public void setName(String name) {

this.name = name;

}

public String getName() {

return name;

}

public void setAge(int age) {

this.age = age;

}

public int getAge() {

return age;

}

}

class Son extends Father {

public Son() {

//super("李四",24);//调父类

this("王五",25);//调本类,不能同时写

System.out.println("Son的空参构造");

}

public Son(String name,int age) {

super(name,age);

System.out.println("Son的有参构造");

}

}

9.继承中的面试题(掌握)

A:案例演示

看程序写结果1

class Fu{

public int num = 10;

public Fu(){

System.out.println("fu");

}

}

class Zi extends Fu{

public int num = 20;

public Zi(){

System.out.println("zi");

}

public void show(){

int num = 30;

System.out.println(num);

System.out.println(this.num);

System.out.println(super.num);

}

}

class Test1_Extends {

public static void main(String[] args) {

Zi z = new Zi();

z.show();

}

}

看程序写结果2

class JavaObject {

public static void main(String[] args) {

Zi z = new Zi();

}

/*

1.Jvm调用了main方法,main进栈

2.遇到Zi z = new Zi();会优先将Fu.class和Zi.class分别加载进内存,

再创建对象;当Fu.class加载进内存,父类的静态代码块会随着Fu.class一起加载,

当Zi.class加载进内存,子类的静态代码块会随着Zi.class一起加载,第一个输出

静态代码块FU,第二个输出静态代码块Zi。

3.走子类的构造方法,因为java中是分层初始化的,先初始化父类,再初始化子类,

所以先走的父类构造,但是在执行父类构造时,发现父类有构造代码块,构造代码

块是优先于构造方法执行的所以第三个输出构造代码块Fu,第四个输出构造方法Fu

4.Fu类初始化结束,子类初始化,第五个输出的是构造代码块Zi,构造方法Zi.

*/

}

class Fu {

static {

System.out.println("静态代码块Fu");

}

{

System.out.println("构造代码块Fu");

}

public Fu() {

System.out.println("构造方法Fu");

}

}

class Zi extends Fu {

static {

System.out.println("静态代码块Zi");

}

{

System.out.println("构造代码块Zi");

}

public Zi() {

System.out.println("构造方法Zi");

}

}

10.继承中成员方法关系(掌握)

A:案例演示

a:不同名的方法

b:同名的方法

class JavaObject {

public static void main(String[] args) {

Son s = new Son();

s.print();

s.method();

}

}

class Father {

public void print() {

System.out.println("Fu print");

}

}

class Son extends Father {

public void method() {

System.out.println("Zi method");

}

public void print() {

super.print(); //super可以调用父类的成员方法

System.out.println("Zi print");

}

}

11.方法重写概述及其应用(掌握)

A:什么是方法重写

重写:子父类出现了一模一样的方法(注意:返回值类型可以是子父类,这个我们学完面向对象讲)

B:方法重写的应用:

当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。这样,即沿袭了父类的功能,又定义了子类特有的内容。

C:案例演示

a:定义一个手机类。

class JavaObject {

public static void main(String[] args) {

Ios8 i = new Ios8();

i.siri();

i.call();

}

}

class Ios7 {

public void call() {

System.out.println("打电话");

}

public void siri() {

System.out.println("speak English");

}

}

class Ios8 extends Ios7 {

public void siri() {

System.out.println("说中文");

super.siri();//注释掉即重写

}

}

12.方法重写的注意事项(掌握)

A:方法重写注意事项

a:父类中私有方法不能被重写

因为父类私有方法子类根本就无法继承

b:子类重写父类方法时,访问权限不能更低

最好就一致

c:父类静态方法,子类也必须通过静态方法进行重写

其实这个算不上方法重写,但是现象确实如此,至于为什么算不上方法重写,多态中我会讲解(静态只能覆盖静态)

子类重写父类方法的时候,最好声明一模一样。

B:案例演示

方法重写注意事项

class JavaObject {

public static void main(String[] args) {

Ios8 i = new Ios8();

i.siri();

i.print();

}

}

class Ios7 {

public void call() {

System.out.println("唱歌");

}

public void siri() {

System.out.println("唱红歌");

}

public static void print() {

System.out.println("Fu print");

}

}

class Ios8 extends Ios7 {

public void siri() {

System.out.println("霸王别姬");

}

public void print() {

System.out.println("Zi print");

}

}

13.方法重写的面试题(掌握)

Override和Overload(重载)的区别?Overload能改变返回值类型吗?

overload可以改变返回值类型,只看参数列表

方法重写:子类中出现了和父类中方法声明一模一样的方法。与返回值类型有关,返回值是一致(或者是子父类)的。

方法重载:本类中出现的方法名一样,参数列表不同的方法。与返回值类型无关。

子类对象调用方法的时候:先找子类本身,再找父类。

14.继承前后的学生和老师案例(掌握)

A:使用继承前的学生和老案例演示

使用继承前的学生和老师案例

属性:姓名,年龄

行为:吃饭

老师有特有的方法:讲课

学生有特有的方法:学习

B:使用继承后的学生和老师案例演示

使用继承后的学生和老师案例

class JavaObject {

public static void main(String[] args) {

Student s = new Student();

s.setName("张三");

s.setAge(23);

System.out.println(s.getName() + "..." + s.getAge());

s.eat();

s.study();

System.out.println("+++++++++++++");

Teacher s2 = new Teacher("李四",24);

System.out.println(s2.getName() + "..." + s2.getAge());

s2.eat();

s2.teach();

}

}

class Person {

private String name;

private int age;

public Person() {

}

public Person(String name,int age) {

this.name = name;

this.age = age;

}

public void setName(String name) {

this.name = name;

}

public String getName() {

return name;

}

public void setAge(int age) {

this.age = age;

}

public int getAge() {

return age;

}

public void eat() {

System.out.println(name + "吃饭");

}

}

class Student extends Person {

public Student() {

}

public Student(String name,int age) {

super(name,age);

}

public void study() {

System.out.println(this.getName() + "学习");

}

}

class Teacher extends Person {

public Teacher() {

}

public Teacher(String name,int age) {

super(name,age);

}

public void teach() {

System.out.println(this.getName() + "老师讲课");

}

}

15.猫狗案例分析,实现及测试(掌握)

A:猫狗案例分析

B:案例演示

猫狗案例继承版

属性:毛的颜色,腿的个数

行为:吃饭

猫特有行为:抓老鼠catchMouse

狗特有行为:看家lookHome

class JavaObject {

public static void main(String[] args) {

Dog s = new Dog();

s.setColor("黑色");

s.setAge(4);

System.out.println(s.getColor() + "..." + s.getAge());

s.eat();

s.lookHome();

System.out.println("+++++++++++++");

Cat s2 = new Cat("白色",4);

System.out.println(s2.getColor() + "..." + s2.getAge());

s2.eat();

s2.catchMouse();

}

}

class Animal {

private String color; //颜色

private int age; //腿

public Animal() {

}

public Animal(String color,int age) {

this.color = color;

this.age = age;

}

public void setColor(String color) {

this.color = color;

}

public String getColor() {

return color;

}

public void setAge(int age) {

this.age = age;

}

public int getAge() {

return age;

}

public void eat() {

System.out.println("吃饭");

}

}

class Dog extends Animal {

public Dog() {

}

public Dog(String color,int age) {

super(color,age);

}

public void eat() {

System.out.println("狗吃肉");

}

public void lookHome() {

System.out.println("看家");

}

}

class Cat extends Animal {

public Cat() {

}

public Cat(String color,int age) {

super(color,age);

}

public void eat() {

System.out.println("猫吃鱼");

}

public void catchMouse() {

System.out.println("抓老鼠");

}

}

16.final关键字修饰类,方法以及变量的特点(掌握)

A:final概述

B:final修饰特点

修饰类,类不能被继承

修饰变量,变量就变成了常量(量命名规范_所有字母大写),只能被赋值一次

修饰方法,方法不能被重写

C:案例演示

final修饰特点

final static final double PI = 3.1415926;

17.final关键字修饰局部变量(掌握)

A:案例演示

方法内部或者方法声明上都演示一下(了解)

基本类型,是值不能被改变

引用类型,是地址值不能被改变,对象中的属性可以改变

{

final int num = 10;

//num = 20;

System.out.println(num);

final Person p = new Person("张三",23);

//p = new Person("李四",24);

p.setName("李四");

p.setAge(24);

System.out.println(p.getName() + "..." + p.getAge());

method(10);

method(20);

public static void method(final int x) {

System.out.pirntln(x);

}

}

18.final修饰变量的初始化时机(掌握)

A:final修饰变量的初始化时机

显示初始化

在对象构造完毕前即可

class JavaObject {

public static void main(String [] args) {

Demo d = new Demo();

d.print();

}

}

class Demo {

final int num; //成员变量的默认初始化值是无效值

public Demo () {

num = 10;

}

public void print() {

System.out.println(num);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值