封装继承多态
1.封装
概念:
隐藏对象的属性和实现细节,对外提供公共的访问方式。
原则:
不需要用户访问的内容隐藏起来
优点:
1.安全性高
2.独立性高
3.复用性高
package org.wdit.unit07;
public class Student2 {
private String name;
private int age;
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public int getAge(){
return age;
}
public void setAge(int a){
age=a;
}
}
class Student2Text{
public static void main(String[] args) {
Student2 student2 = new Student2();
student2.setAge(20);
System.out.println(student2.getAge());
student2.setName("赵童");
System.out.println(student2.getName());
}
}
2.private关键字
1.他是一个权限修饰符
2.成员变量和成员方法
3.被它修饰的成员变量和成员方法只能在本类中被访问,如果其他类像访问,就必须提供公共的访问方式。
package org.wdit.unit07;
public class Student2 {
private String name;
private int age;
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public int getAge(){
return age;
}
public void setAge(int a){
age=a;
}
}
class Student2Text{
public static void main(String[] args) {
Student2 student2 = new Student2();
student2.setAge(20);
System.out.println(student2.getAge());
student2.setName("赵童");
System.out.println(student2.getName());
}
}
3.封装和private的应用
1.私有化成员变量
2.提供公共的访问方式:getXxx()/setXxx()
4.this关键字
1.表示当前类的对象
2.谁调用该方法,该方法内部的this就代表谁
3.解决局部变量和成员变量同名问题
5.构造方法
概述:
初始化类的对象,并对对象的属性进行初始化
格式:
1.没有返回值这一项
2.方法名与类名相同
注意事项:
1.如果我们没有给出构造方法,系统会隐式的提供一个无参构造方法
2.如果我们给出了构造方法,无论是有参还是无参系统都不在隐式的提供无参构造,推荐大家给出有参方法的同时,也给出无参构造
package org.wdit.unit07;
public class Student {
String name;
private int age;
public void study(String xueKe){
System.out.println("我正在学"+xueKe);
}
public void setAge(int a){
if (a<0){
System.out.println("拜拜你那");
}else{
age=a;
}
}
public int getAge(){
return age;
}
}
class StudentDemo{
public static void main(String[] args) {
Student student = new Student();
student.name="终南山";
student.setAge(18);
System.out.println(student.name);
System.out.println(student.getAge());
student.name="袁隆平";
student.setAge(-2);
System.out.println(student.name);
student.setAge(-2);
}
}
package org.wdit.unit07.gouzao;
public class Computer {
private String dell;
private int price;
private String color;
public Computer(){
}
public Computer(String dell,int price,String color){
this.dell=dell;
this.price=price;
this.color=color;
}
public void setDell(String dell){
this.dell=dell;
}
public void setColor(String color){
this.color=color;
}
public void setPrice(int price){
this.price=price;
}
public void show(){
System.out.println("价格:"+price);
System.out.println("品牌:"+dell);
System.out.println("颜色:"+color);
}
}
class ComputerDome{
public static void main(String[] args) {
Computer computer=new Computer();
computer.show();
Computer computer1=new Computer("小米",2599,"白");
computer1.show();
Computer computer2 = new Computer();
computer2.setColor("黑");
computer2.setDell("华为");
computer2.setPrice(2999);
computer2.show();
}
}
6.static关键字
概述:
针对对象中,有共同属性的这种情况,java提供了一个关键字来解决资源共享问题:static
特点:
1.随着类的加载而加载
main方法
public static void main(String[] args)
2.先于对象存在
3.被该类的所有对象共享(判断是否被static关键字修饰的依据)
4.通过类名直接调用
package org.wdit.mystatic;
public class StaticText {
public static void main(String[] args) {
Student student = new Student();
student.name = "赵童";
student.age = 20;
student.show();
student.school="西邮";
Student.dorm="长思五115";
student.show();
Student student2 = new Student();
student2.name = "屈波";
student2.age = 20;
student2.show();
Student student3 = new Student();
student3.name = "唐康";
student3.age = 21;
student3.show();
}
}
class Student{
public String name;
public int age;
public static String dorm;
public static String school;
public void show(){
System.out.println("姓名:"+name+"\t年龄:"+age+"\t学校:"+school+"\t宿舍:"+dorm);
}
}
注意事项:
1.静态方法中不能出现this关键字
2.静态方法中只能调用静态的方法或静态的属性
package org.wdit.mystatic;
public class StaticText1 {
}
class Student1 {
private String name;
private int age;
private static String school;
private static String dorm;
public void show1() {
}
public void show2() {
System.out.println(name);
System.out.println(school);
show1();
show3();
}
public static void show3() {
}
public static void show4() {
System.out.println(school);
show3();
}
}
面试题:简述静态变量和成员变量的区别
1.所属不同
静态变量–类
成员变量–对象
2.储存位置的不同
静态变量--方法区的静态区
成员变量--堆内存
3.生命周期的不同
静态变量–是类的加载而加载,随类的消亡而消亡
成员变量–随对象的产生而产生,随对象的消亡而消亡
4.使用方式的不同
静态变量–通过类名直接调用
成员变量–通过对象名直接调用
7.main方法
public static void main(String[] args)
8.API的使用
步骤:
1.打开API
2.左上角-----索引—输入要查询的类
3.查看类的组成
1.成员变量-字段重要
2.成员方法-方法摘要
3.构造方法-构造摘要
4.学习构造方法
1.有构造方法:按照的格式去创建
2.无构造方法:它的属性和方法一般都是被static修饰,直接通过类名调用即可
5.学习成员方法
1.变量和类型:
1.是否被static修饰
2.是否有返回值:方法返回什么,我们就用什么
2.方法:
1.方法名:有些方法名很像,任意调错
2.参数列表:方法需要什么类型的数据,需要几个,我们按照要求给它就可以了
package org.wdit.adi;
public class ADIDemo {
public static void main(String[] args) {
for (int i=0;i<100;i++){
double num = Math.random()*100+1;
int sum = (int)num;
System.out.println(sum);
}
}
}
9.代码块
概述:被一对花括号包裹的代码就叫代码块
局部代码块:
局部位置:用于限定变量的生命周期
构造代码块:成员位置
1.先于构造方法执行,只要执行构造方法,他都会被执行
2.将多个构造方法相同的代码放到构造代码块中,对对象进行初始化操作
静态代码块:成员位置
1.随着类的加载而被执行
2.只执行一次
3.对类进行初始化
package org.wdit.mystatic;
public class CodeDemo {
static{
System.out.println("静态代码块");
}
{
int age = 50;
System.out.println(age);
System.out.println("构造代码块");
}
public CodeDemo(){
System.out.println("构造方法");
}
public static void main(String[] args) {
{
int a=10;
System.out.println(a);
System.out.println("局部代码块");
}
System.out.println("---------------------------------------");
CodeDemo codeDemo = new CodeDemo();
CodeDemo codeDemo1=new CodeDemo();
}
}
面试题:
静态代码块,构造代码块,构造方法三者的执行顺序?
1.静态代码块
2.构造代码块:只要调用构造方法,它都会先于构造方法执行
3.构造方法
package org.wdit.mystatic;
class Student2{
{
System.out.println("构造代码块");
}
static{
System.out.println("静态代码块");
}
public Student2(){
System.out.println("构造方法");
}
}
public class CodeTxet {
static {
System.out.println("CodeText静态代码块");
}
public static void main(String[] args) {
System.out.println("Main方法执行了");
Student2 student2 = new Student2();
Student2 student1 = new Student2();
}
}
CodeText静态代码块
Main方法执行了
静态代码块
构造代码块
构造方法
构造代码块
构造方法
10.继承
通过演示案列,我们发现,两个类中有许多相同的代码,如果我们继续定义警察类,工人类等,重复的代码会越来越多。能不能把这些相同的代码提取出来,定义到一个单独的类中,并让这多个类与这个提取出来的类产生一个关系,有了这个关系之后,就可以让这多个类具有这个提取类中的属性和功能。为了实现这个效果,Java提供了一个技术:叫做继承
概述:
把多个类中相同成员提取出来,定义到一个独立的类中。然后让这个独立的类产生一个关系,多个类就具备了这个独立类的属性和功能,这个关系就叫做继承。
关键字:
extends
格式:
class 子类 extends 父类{
}
package org.wdit.adi;
import java.util.zip.ZipEntry;
public class ExtendsDemo {
public static void main(String[] args) {
Zi zi = new Zi();
zi.method();
zi.name="建键";
System.out.println(zi.name);
}
}
class Fu{
public String name;
private int age;
public void method(){
System.out.println("Fu 普通方法");
}
private void method1(){
System.out.println("Fu 私有方法");
}
}
class Zi extends Fu{
}
优点:
1.提高代码的复用性
2.提高了代码的可维护性
3.多态的前提
特点:
1.单继承:只能有一个父类
2.多层继承:父类也可以有自己的父类
注意事项:
1.子类只能继承父类非私有的成员变量和方法
2.子类不能继承父类的构造方法
3.继承使用场景:“is a”
父类的成员变量与子类成员变量同名问题
1.在子类的局部变量中找
2.在子类的成员变量中找
3.在父类的成员变量中找
4.找不到就报错
package org.wdit.adi;
public class ExtendsDemo2 {
public static void main(String[] args) {
Zi2 zi2=new Zi2();
zi2.method1();
System.out.println(zi2);
System.out.println(zi2.method1());
zi2.num=10;
System.out.println(zi2.num);
System.out.println(zi2.method());
Zi2 z=new Zi2();
z.mothod2("zhao");
}
}
class Fu2{
public int num=40;
public int method(){
return num;
}
private void Name(){
System.out.println();
}
public void mothod2(String name){
System.out.println("打电话");
}
}
class Zi2 extends Fu2{
public int num;
public int method1(){
int num=30;
return this.num=num;
}
public void mothod2(String name){
System.out.println("打视频电话");
}
}
11.super关键字
概述:
super关键字代表的是父类对象
用法:
1.访问成员变量
super.成员变量
2.访问构造方法
super.(……)
3.访问成员方法
super.成员方法()
package org.wdit.mysuper;
public class SuperDemo {
public static void main(String[] args) {
Zi zi = new Zi();
zi.show();
}
}
class Fu{
int age = 40;
}
class Zi extends Fu{
int age = 20;
public void show(){
int age = 10;
System.out.println(age);
System.out.println(this.age);
System.out.println(super.age);
}
}
12.继承中构造方法的关系
1.子类中所有的构造方法都默认的访问父类的无参构造方法。
因为继承的关系,子类对象可以使用父类的非私有的属性和方法,所以在创建子类对象前,必须对父类的数据进行初始化(创建对象)
2.所有子类的构造方法,第一句默认的都是:super()
3.如果父类中没有无参构造方法,将无法创建子类对象
解决方法:1:在父类中添加无参构造
2.同super关键字指定访问父类的有参构造
3.子类可以通过this调用本类中的其他构造方法;但是被调用的构造方法必须手动调用父类的有参构造
4.this()和super()都必须是构造方法中的第一句,并且它两不能同时出现
13.继承中成员方法的关系
1.现在子类中找
2.如果子类中找不到,再在父类中找
3.如果找不到,就报错
14.方法的重写:
子类和父类中的方法声明完全相同时,就会发生方法的重写
重写的应用:
可以重写父类中的方法,可以使子类中既拥有父类中的方法,也可以有自己特有的方法
注意事项:
1.父类的私有方法不能被重写
2.子类重写父类的方法,访问权限不能降低
3.子类重写父类的静态方法,也必须通过静态方法去重写(它不是方法重写,但是形式与重写相似。
15.final
可以修饰类,方法,变量
修饰类:类不能被继承
修饰方法:不能比重写
修饰变量:
基本数据类型:初始化后,其值不能再改变
引用数据类型:引用数据类型的地址不能变,但是地址指向堆内存中的数据可以被改变
注意事项:
1.被final修饰的变量必选在构造方法执行完毕前被初始化。
2.只能赋值一次
16.多态
概述:
同一操作作用于不同的对象,可以产生不同的结果
同一个对象,在不同时刻表现出来不同形态
package org.wdit.adi;
public class duotai {
public static void main(String[] args) {
Pets pets=new Cat();
Pets pets2 = new Dog();
pets.voice();
pets2.voice();
}
}
class Pets{
public void voice(){
System.out.println("发出叫声");
}
}
class Cat extends Pets{
public void voice(){
System.out.println("喵喵");
}
}
class Dog extends Pets{
public void voice(){
System.out.println("汪汪");
}
}
成员访问特点:
package org.wdit.adi;
public class DouTaiDemo2 {
public static void main(String[] args) {
Fu3 fu=new Zi3();
System.out.println(fu.num);
System.out.println(fu.num2);
fu.eat();
fu.music();
}
}
class Fu3{
public int num=10;
public int num2=20;
public void eat(){
System.out.println("吃东西");
}
public static void music(){
System.out.println("听音乐");
}
}
class Zi3 extends Fu3{
public int num=30;
public int num3=40;
@Override
public void eat() {
System.out.println("吃美食");
}
public void playDemo(){
System.out.println("玩游戏");
}
public static void music(){
System.out.println("听流行音乐");
}
public static void sing(){
System.out.println("唱一首凉凉");
}
}
10
20
吃美食
听音乐
注意事项:
1.向上转型
Fu fu = new Zi()
2.向下转型
Zi zi=(Zi) fu
package org.wdit.adi;
public class duotai {
public static void main(String[] args) {
Pets pets=new Cat();
pets.voice();
Pets pets2 = new Dog();
pets2.voice();
Cat cat = (Cat) pets;
cat.voice();
cat.play();
Dog dog = (Dog) pets2;
dog.voice();
dog.play();
}
}
class Pets{
public void voice(){
System.out.println("发出叫声");
}
}
class Cat extends Pets{
public void voice(){
System.out.println("喵喵");
}
public void play(){
System.out.println("猫玩猫薄荷");
}
}
class Dog extends Pets{
public void voice(){
System.out.println("汪汪");
}
public void play(){
System.out.println("狗追自己的尾巴");
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)