代码块、super关键字、方法重写、多态、抽象类、接口、内部类、匿名内部类、选择排序
代码块
1.局部代码块:在方法定义中用{}括起来的内容
作用:限定局部变量的生命周期。
2.构造代码块:在类中的成员位置定义的{}
作用:执行构造方法之前先执行构造代码块,然后对当前数据(类中的成员变量)进行初始化,将构造方法中的共性内容存储到构造代码块中。(一般情况都是通过构造方法初始化)
3.静态代码块:在类中的成员位置定义的static修饰的{}中的内容
作用:随着类的加载而加载,在{}里面给数据进行初始化,整个{}优先于对象存在,而且静态代码块只执行一次,因为类就加载一次。
例:看程序写结果
package com.qianfeng_01; class A{ int i = 100; public static void num() { int j = 200; System.out.println(j); } { System.out.println(i); } public void num1() { System.out.println(i); } } class B extends A{ int x = 300; public void num2() { System.out.println(x); } { System.out.println(x); } public static void num3() { int k = 400; System.out.println(k); } } public class NumTest { public static void main(String[] args) { A a = new B(); B b = (B)a; b.num(); b.num1(); b.num2(); b.num3(); } }
继承(关键字:expends)
1.概念:将多个类中的共性内容抽取出来,放在另一个独立的类中,让这个独立的类(父类/超类)和其他类(子类/派生类)产生一种关系,这种关系称为继承。
2.格式: class 子类名 expends 父类名{}
3.好处:(1)提高了代码的复用性;
(2)提供了代码的维护性;
(3)类和类产生了这种“继承”关系。
4.继承的特点
在java语言中,类和类只支持单继承,不支持多继承,但支持多层继承。
例:
package com.qianfeng_01; //测试类 public class AnimalTest { public static void main(String[] args) { // TODO Auto-generated method stub Animal animal = new Dog("tom",3,"咖啡色"); System.out.println(animal.getName()+"\t"+animal.getAge()+"\t"+animal.getColor()); Dog dog = (Dog)animal; dog.lookDoor(); AnimalTool.UserAnimal(new Dog()); animal = new Cat("baby",2,"黑色"); System.out.println(animal.getName()+"\t"+animal.getAge()+"\t"+animal.getColor()); System.out.println(); Cat cat = (Cat)animal; cat.play(); AnimalTool.UserAnimal(new Cat()); } } package com.qianfeng_01; //动物类 父类 public class Animal { private String name; private int age; private String color; public Animal() { super(); // TODO Auto-generated constructor stub } public Animal(String name, int age, String color) { super(); this.name = name; this.age = age; this.color = color; } 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; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } //共有的方法 public void eat() { System.out.println("动物吃饭"); } public void sleep() { System.out.println("动物睡觉……"); } } package com.qianfeng_01; //子类 (猫类) public class Cat extends Animal { public Cat() { super(); // TODO Auto-generated constructor stub } public Cat(String name, int age, String color) { super(name, age, color); // TODO Auto-generated constructor stub } public void eat() { System.out.println("猫吃鱼……"); } public void sleep() { System.out.println("猫趴着睡……"); } public void play() { System.out.println("猫玩毛线……"); } } package com.qianfeng_01; //子类(狗类) public class Dog extends Animal { public Dog() { super(); // TODO Auto-generated constructor stub } public Dog(String name, int age, String color) { super(name, age, color); // TODO Auto-generated constructor stub } public void eat() { System.out.println("狗吃骨头……"); } public void sleep() { System.out.println("狗卧着睡……"); } public void lookDoor() { System.out.println("狗看门……"); } } package com.qianfeng_01; //工具类 public class AnimalTool { public static void UserAnimal(Animal a) { a.eat(); a.sleep(); } }
super关键字
1.super:代表父类的空间标识(代表父类的对象的空间地址值引用)。
2.this和super的区别?
this:代表当前类对象的地址值引用
super:代表的父类的空间标识(父类对象的地址值引用)
this和super使用区别:
访问成员变量
this.成员变量名;访问本类的成员变量
super.成员变量名;访问的父类的成员变量
访问构造方法
this():访问的本类无参构造方法
super():访问父类的无参构造方法
this(xx):访问本类的有参构造方法
super(xx):访问父类的有参构造方法
访问成员方法
this.成员方法名();访问本类的成员方法
super.成员方法名();访问的父类的成员方法
3.super():如果在子类中的构造方法显示给出了,必须写在第一句,否则可能出现父类数据多次初始化。
4.继承中成员方法的关系
(1)子类继承父类,如果子类的成员方法和父类的成员方法不一致,只要通过子类对象分别调用即可。
(2)如果子类的成员方法和父类的成员方法一致:
1)先在子类成员位置找,如果有就使用;
2)如果没有,就在父类成员方法位置中找,如果有就使用;
3)如果没有,就报错,说明访问了一个不存在的变量。
方法重写(override)
1.概念:在继承关系中,子类出现了和父类一模一样的方法,这个时候,子类就会把父类的方法覆盖掉。这种现象称为方法重写。
例:猫狗案例
package com.qianfeng.doganli; //测试类 public class DogGetAllTest { public static void main(String[] args) { Animal[] animals = new Animal[6]; //System.out.println(dog.name); animals[0]= new Dog("tom"); animals[1]=new Cat("buyci"); animals[2]= new Dog("huage"); animals[3]=new Cat("banser"); animals[4]= new Dog("ran"); animals[5]=new Cat("mimi"); //程序用时 long startNano = System.nanoTime(); Dog[] as = DogGetAll(animals); //遍历数组中的每一个元素 for(int i=0;i<as.length;i++) { System.out.println(animals[i].getName()); } System.out.println(System.nanoTime()-startNano); } /* * 将一组动物中Dog的对象,挑选出来,并保存在一个Dog类型的数组中,并返回 */ public static Dog[] DogGetAll(Animal[] animals) { //1.定义计数器 int count=0; int size=0; //2.先数一遍,数组中有几只狗,再创建数组 for (int i = 0; i < animals.length; i++) { //3.判断数组中每个元素,进行遍历 if (animals[i] instanceof Dog) { //每发现一个Dog对象,计数器就增加一次 count++; } } //4.根据计数结果创建合适的Dog数组 Dog[] dogs = new Dog[count];//时间(就是运行是的时间)和空间(资源)的平衡,效率与安全的平衡 //5.将animals所有的Dog对象保存在Dog对象中 for (int i = 0; i < animals.length; i++) { //判断是否为Dog类型 if (animals[i] instanceof Dog) { //将animals数组元素强转后,保存在数组中 dogs[size]=(Dog) animals[i]; //Dog数组的有效元素计数器自增 size++; } } //将保存了所有的狗对象的数组,返回方法调用处 return dogs; } } package com.qianfeng.doganli; //动物类 public class Animal { public String name; public Animal() { super(); // TODO Auto-generated constructor stub } public Animal(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } package com.qianfeng.doganli; public class Cat extends Animal { public Cat() { super(); // TODO Auto-generated constructor stub } public Cat(String name) { super(name); // TODO Auto-generated constructor stub } } package com.qianfeng.doganli; public class Dog extends Animal { public Dog() { super(); // TODO Auto-generated constructor stub } public Dog(String name) { super(name); // TODO Auto-generated constructor stub } }
面试题
方法重写和方法重载的关系?
方法重载:方法名相同,参数列表不同,与返回值无关。
方法重写:方法名相同,参数列表相同。
多态
1.概念:一个事物在不同时刻的体现。
2.多态的前提条件:
(1)必须有继承关系
(2)方法重写,子类继承父类,将父类的功能覆盖掉,使用子类最具体的功能。
(3)父类引用指向子类对象。
3.多态成员方法实例化
向上转型:父类名 对象名 = new 子类名();
向下转型:子类名 对象名 = (子类名)父类对象名;
抽象类(关键字:abstract)
1.概念:在一个类中,如果该类中存在一个功能,仅仅声明方法,没有方法体(抽象方法),需要将该类定义为抽象类。
2.抽象类的特点:
1)如果一个类中有抽象方法,那么该类一定是抽象类;如果一个类是抽象类,那么该类中不一定有抽象方法。
2)抽象类不能实例化
3)抽象类需要通过子类进行实例化,父类引用指向子类对象。(抽象类多态)
3.格式:权限修饰符 abstract 返回值类型 方法名(形式参数){}
4.abstract和哪些关键字不能使用?
final 修饰的成员方法,不能重写,所以冲突了;
private 修饰的成员方法只能在本类中访问。
static 修饰的成员方法跟类有关,随着类的加载而加载,此时抽象方法没有方法体,加载进能存没有意义。
可以和public和protected权限修饰符使用。
例:定义一个抽象类student类和一个Demos类,Demos类中定义一个方法传入实体类参数。
package com.qianfeng.formal; //参数为抽象类 abstract class Students{ public void study() { System.out.println("爱学习,爱生活"); } } class Demos{ public void play(Students s) { s.study(); } } //创建子抽象类 class Teacher extends Students{ @Override public void study() { System.out.println("Good Good study,Day Day up!"); } } //测试类 public class FormalTestDemo2 { public static void main(String[] args) { Demos demo = new Demos(); Students student = new Teacher(); student.study(); } }
接口(关键字:interface)
1.概念:体现的是事物的一中扩展性功能。
2.接口中只能定义公开静态常量和公开抽象方法。
3.接口的成员特点是什么?
(1)成员方法:只能是抽象方法,存在默认修饰符,public abstract
(2)成员变量:只能是常量,存在默认修饰符,public static final
(3)构造方法:不存在构造方法。
例如:
interface MyInterface{ //公开静态常量 public static final String = "abc"; public final String = "abc"; public static String = "abc"; String = "abc"; //公开抽象方法 public abstract void m1(); public void m2(); abstract void m3(); void m4(); }
4.抽象类和接口的区别?
(1)成员区别
成员变量:1)抽象类:既可以定义常量,也可以定义变量;
2)接口:只能定义常量,存在默认修饰符public static final
成员方法:1)抽象类:既可以定义抽象方法,也可以定义非抽象方法
2)接口:只能定义抽象方法,存在默认修饰符public abstract
构造方法:1)抽象类:存在构造方法,有参/无参,对数据进行初始化
2)接口:没有构造方法。
(2)关系区别:
类与类之间:不管这个类是抽象类还是具体类,都有继承关系;支持单继承,不支持多继承,但支持多层继承。
类于接口之间:Implements 一个类继承另一个类的同时,可以实现多个接口。
接口与接口之间:是继承关系,也可以多继承;提高代码的复用性,父接口中有的功能,子接口也具备该功能。
例`:
package com.qianfeng; //定义一个接口 interface Inner{ void show(); } class Outer1{ public static Inner method() { //接口的匿名内部类,返回该接口的子实现类 return new Inner() { @Override public void show() { System.out.println("helloword"); } }; } } public class InnerfaceTest { public static void main(String[] args) { Outer1.method().show();//类名调用方法,说明该方法为一个静态 } }
内部类
1.概念:就是在一个类中定义另一个类。
2.内部类可以访问外部类的成员,包括私有!
3.内部类的划分?局部内部类访问局部变量,JDK7以后在优化的时候自动为这个变量加上final,为什么?
解:分类:
成员内部类:在外部类的成员位置定义的类;
局部内部类:外部类成员方法中定义的类。
原因:局部变量的生命周期,随着方法调用而存在,随着方法调用完毕而消失,而当前这个局部变量被局部内部类在进行访问(局部内部类对象进行访问),在堆内存中对象不会被立即回收,它还在继续使用这个局部变量,需要将这个变量定义为常量,常驻内存---->以便局部内部类对象对该局部变量的访问!
4.需要访问静态成员内部类中的成员方法的访问方式!
外部类名.内部类名 对象名 = new 外部类名.内部类名();
对于内部类中的静态成员方法:
外部类名.内部类名.方法名();
package com.qianfeng_1; /* * 局部内部类 */ //定义一个外部类 class Demo1{ //定义一个私有属性 private int i = 100; static int j = 200; public void method() { class Demo2{ public void show() { System.out.println(i); System.out.println(j); } } //创建内部对象 Demo2 demo2 = new Demo2(); demo2.show(); } } //测试类 public class InnerTestJubu { public static void main(String[] args) { //创建外部类的对象 Demo1 demo = new Demo1(); demo.method(); } }
匿名内部类(一般在局部位置)
格式: new 类名/接口名(){
//方法重写;
};
本质:继承了该类或着实现了该接口的子类对象!
package com.qianfeng.day13night; //定义一个接口 interface Inter{ public abstract void name(); } //定义一个类 class Demo{ //定义一个私有属性 private String str = "abc"; public Inter method(Inter inter) { System.out.println(str); return inter; } } //测试类 public class InterfaceTest { public static void main(String[] args) { Demo demo = new Demo(); Inter inter = demo.method(new Inter() { @Override public void name() { System.out.println("爱学习"); } }); inter.name(); } }
选择排序
1.选择排序的思想:
使用0角标对应的数组元素依次和后面角标的元素进行比较,把小的往前放,第一次比较完毕,最小值就出现在了最小索引出,依次这样比较,可以得到排好序的数组!
2.总共比较次数=数组长度-1.
public class Array{ public static void main(String[] args){ int[] arr={12,25,3,14,26}; array(arr); bianLi(arr); } public static void bianLi(int[] arr){ for(int i=0;i<arr.length;i++){ if(i==arr.length-1){ System.out.print(arr[i]+" "); }else{ System.out.print(arr[i]+", "); } } } public static void array(int[] arr){ for(int i=0;i<arr.length-1;i++){ for(int j=i+1;j<arr.length;j++){ if(arr[j]<arr[i]){ int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; } } } } }
- Java思维导图=类与对象+Jvm中的数据储存模式 + 继承、重写和多态 + 包和访问权限 + 类的封装 + String 字符串及其方法 + 抽象类和接口 + 内部类
- JAVA基础知识点汇总【Scanner类、Random类、ArrayList类、String类、static、Arrarys、Math类、继承、super、this、抽象类、接口、多态、权限、内部类】
- 代码块,继承;方法的重写与重载的区别;final关键字;多态;向下转换(案例:孔子装爹)
- 7月21日---关键字、抽象方法、抽象类、接口、多态及总结、设计模式
- NO8.java笔记【面向对象、抽象类、abstract、接口、interface、多态 、内部类、匿名内部类、异常、Object类】
- 黑马程序员—Java面向对象(抽象类、模板方法设计模式、接口、多态、内部类)
- Java第11次作业:什么是继承?继承的好处?什么是覆写?super()?构造代码块?子父类初始化顺序? 抽象类能用final声明吗?final关键字声明类 方法 变量以及全局常量?抽象类的构造方法?
- java-----权限修饰符,重写,super和final关键字,多态,转型和抽象类
- Java基础——权限修饰符、重写、super、final关键字、Object类、toString方法、equals、多态、转型cast、抽象abstract
- java 继承 方法重写 自动转型 多态 接口 抽象类
- 方法的重写与重载、final关键字、抽象类abstract、接口
- C#-面向对象的三大特性——多态(虚方法与重写、抽象类、接口)
- 黑马程序员 Java基础 面向对象:继承、final关键字、抽象类、模版方法模式、接口、多态、Object类
- java 继承 方法重写 自动转型 多态 接口 抽象类
- JAVA基础--重载与重写,接口与抽象类,构造方法的作用,代码块的分类
- day01-继承、方法重写、super关键字、this关键字、抽象类知识点详细总结
- 2.0 面向对象 类与实例(关键字)、封装、继承、多态(虚方法,抽象类,抽象方法,接口)
- 代码块,继承的概述与应用,方法重写,super关键字,final关键字
- java——多态,向上转型,向下转型,抽象类抽象方法,工厂模式,接口与各种类的区别,内部类,静态内部类
- 7.1面向对象(继承中成员方法关系,final关键字,多态,抽象类,接口)