打补丁:类的命名应遵守首字母大写和驼峰原则
tips:
public class stu {
//属性
String name;
int age;
//方法
public void setAge(int stuAge){
this.age=stuAge;
}
public int getAge(){
return this.age;
}
}
2)运行代码 application.java
public class application {
public static void main(String[] args) {
//new实例化类
stu stuList=new stu();
int stuAge=stuList.getAge();
System.out.println("年龄:"+stuAge);
}
}
tips:
public class stu {
//属性
String name;
int age;
double height;
//方法
public stu() {
System.out.println("无参构造方法被调用");
}
public stu(String name, int age,double height) {
this.name = name;
this.age = age;
this.height=height;
System.out.println("有参构造方法被调用");
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2)运行代码 application.java
public class application {
public static void main(String[] args) {
//new实例化类
stu stuNull=new stu();
stu stuList=new stu("liqour",21,180);
int stuAge=stuList.getAge();
System.out.println("年龄:"+stuAge);
}
}
tips:
tips:
tips:
tips:
public class stu {
//属性
int age;
String name;
//方法
public stu() {
System.out.println("无参构造方法被调用");
}
public stu(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2)运行代码 application.java
public class application {
public static void main(String[] args) {
//new实例化类
stu stuA=new stu(21,"liquor");
int stuAge= stuA.getAge();
System.out.println("A年龄:"+stuAge);
stu stuB=new stu(20,"gin");
stuAge= stuB.getAge();
System.out.println("B年龄:"+stuAge);
}
}
tips:
1.程序设计需要追求高内聚,低耦合。类的内部数据操作细节自己完成,外部不可干涉;尽量少向外部暴露。
2.方法:属性定义为私有private,通过get/set获取/修改(快捷键Alt+Fn+Insert)
tips:
public class 子类名 extends 父类名
{
子类内容;
}
public class Person {
//属性
private String name;
private int age;
//无参
public Person() {
System.out.println("Person的无参构造方法被调用");
}
//有参
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2)Stu类
public class Stu extends Person{
//属性
private String name;
//方法
//无参
public Stu() {
//此处存在系统隐式调用的父类无参构造函数
System.out.println("Stu的无参构造方法被调用");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//有参
public Stu(int age, String name, String stuName) {
//显式调用父类的有参构造函数
super(name,age);
//父类构造函数必须在第一行
this.name=stuName;
System.out.print("Person类的姓名:"+super.getName()+"\n");//取父类的非private方法
System.out.println("Stu类的姓名:"+this.getName());//调用本身
}
}
3)运行代码 Application.java
public class Application {
public static void main(String[] args) {
//子类无参构造
Stu stuA=new Stu();
//子类有参构造
Stu stuB=new Stu(21,"liquor","gin");
}
}
tips:
tips:
tips:
作用意义:由于父类的功能不满足子类的具体需要,子类对父类非私有、非静态的方法,重写内容
特性:
1)是继承之间,子类对父类操作
2)方法名和参数列表必须一致
3)子类重写的方法修饰符范围只能缩小不能扩大(public>protected>default>private)
4)重写会抛出异常,子类异常的范围可以缩小不能扩大
IDEA快捷键:Ctrl+O或者在生成栏(Fn+Insert+Alt)中可以自动生成代码
方法是否静态(staitc)
方法状态 | 影响 |
---|---|
静态 | 静态方法的调用只和定义的左边的类型有关(非重写) |
非静态 | 当父类的引用指向子类(多态),非静态非私有的,调用子类的方法 |
tips:
F father=new S();
声明 | 调用范围 |
---|---|
子类变量new子类,S a=new S(); | 对象a能调用自己的方法或者从父类继承的非私有的方法 |
父变量new子类,F a=new S(); | 当子类S中有对父类F非私有非静态方法重写时,调用子类重写的方法;但是不可以调用子类独有的方法 |
特性:
1)多态只有方法,没有属性
2)多态是父类变量New子类,必须有父子关系,否则出现类型转换异常,报错:ClassCastException!
动态的父类调用逻辑
1)首先看该方法能否被调用,即父类是否拥有该方法。某种方法(名)能否被调用,看等式的左侧类型是否包含该方法(即多态的父类变量不可以调用子类独有的方法,此处要与继承区分,继承是子类可以调用父类所有非私有的方法),见example1。
2)其次看该方法是否被子类重写,若该方法(非私有非静态)被子类重写,则动态的父类调用子类的方法。见example2。
example1:
父类Person独有非静态非私有方法fatherTest(),可以被子类变量继承调用;子类Stu独有方法不能被父类变量调用
1)父类Person
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void fatherTest(){
System.out.println("fatherTest");
}
}
2)子类Stu
public class Stu extends Person{
//方法
public Stu() {
}
public Stu(int age, String name) {
//显式调用父类的有参构造函数
super(name,age);
}
public void sonTest()
{
System.out.println("SonTest");
}
}
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void test() {
System.out.println("Person->getName");
}
public static void testSta() {
System.out.println("Person->test");
}
}
2)子类Stu
public class Stu extends Person{
//方法
public Stu() {
}
public Stu(int age, String name) {
//显式调用父类的有参构造函数
super(name,age);
}
@Override
public void test() {
System.out.println("Stu->getName");
}
public static void testSta() {
System.out.println("Stu->test");
}
}
3)测试代码 Application.java
package oop;
public class Application {
public static void main(String[] args) {
Stu stuA=new Stu();
Person stuB=new Stu();//重写
Person stuC=new Person();
//非静态
stuA.test();
stuB.test();
stuC.test();
//静态
stuA.testSta();
stuB.testSta();
stuC.testSta();
}
}
tips:
A relVar=new B();
boolean result=relVar instanceof C;
结果为True:
运行结果:
3)Person per=new Stu();
可编译:
结果为True:
运行结果:
4)Person person=new Person();
可编译:
结果为True:
tips:
1.方便方法调用,用于解决父类引用指向子类时,又希望调用子类独有方法的情况。
转换方向 | 方法 | 应用 |
---|---|---|
父类转换子类 | 强制转换 | 解决父类引用指向子类时,解决多态存在父类变量不可以调用子类独有的方法的问题 |
子类转换父类 | 自动转换 | 见多态 |
F relVar=new S();
((S) relVar).sonTest();
参考整理自Java中final关键字
public final class 类名{
}
tips:
public final 返回值类型 方法名(形参表){
}
tips:
tips:
tips:
public abstract class 类名{
public abstract void test();
}
tips:
类别 | 特性 |
---|---|
普通类 | 具体实现方法 |
抽象类 | 具体实现方法和抽象方法都有,局限是只能单继承 |
接口 | 只有规范,不能写方法 |
public interface 接口名{
}
public class 类名 implements 接口名1,接口名2{
}
简记科普,后续再打补丁
tips:
public class Outer {
private int id=10;
public Outer() {
}
public Outer(int id) {
this.id = id;
}
public void out(){
System.out.println("外部类的方法");
}
public class Inner{
public void in(){
System.out.println("内部类的方法");
}
//内部类获得外部类的私有属性
public void getID(){
System.out.println(id);
}
}
}
2)运行代码Application.java
package oop;
public class Application {
public static void main(String[] args) {
Outer outer=new Outer();//初始化外部类
Outer.Inner inner=outer.new Inner();//初始化内部类
inner.getID();
}
}
tips:
1.静态内部类不能取外部类的私有属性,因为静态先生成
2.相比成员内部类,增加一个static修饰词
tips:
public calss Outer{
public void method(){
class Inner{
public void in(0{
}
}
}
}
tips:
new Outer().out();
tips:
public class Person {
private String name;
public static int nom;
public Person() {
}
}
2)测试代码Application.java
public class Application {
public static void main(String[] args) {
Person personVar=new Person();
int nom=personVar.nom;//对象名调用
nom=Person.nom;//类名调用
}
}
静态方法
在一个类中,非静态方法可以直接通过方法名调用静态方法;静态方法不可以直接调用非静态方法
静态代码块
1)只会执行一次
2)语法结构
public class Person
{
static{
//静态代码块
}
}
3)example:静态代码块、匿名代码块、构造方法执行顺序:静态代码块执行一次,之后每次new新对象,执行匿名代码块和构造方法。
public class Teacher{
{
System.out.println("匿名代码块");
}
static{
System.out.println("静态代码块");
}
public Teacher() {
System.out.println("构造方法");
}
public static void main(String[] args) {
Teacher per1=new Teacher();
System.out.println("***************");
Teacher per2=new Teacher();
}
}
tips:
import static java,lang.Math.random;
简记科普,后续再打补丁
tips:
名称 | 定义 |
---|---|
检查性异常 | 最具代表性的是用户错误或问题引起的异常,无法被遇见,在编译时不能被简单忽略 |
运行时异常 | 可能被程序员避免的异常,在编译时会被忽略 |
错误 | 错误不是异常,是脱离程序员控制的问题,如栈溢出,在编译时无法报错 |
tips
关键字 | 用法 |
---|---|
try | 监控区域 |
catch | 捕获异常,括号内是希望捕获的异常类型 ,可以写多个catch捕获多个异常,要将异常类型最小的写在最前面,层层递进 |
finally | 无论是否捕获到异常都会执行,在try-catch-finally中,finally可以没有,但主要用于IO流时关闭资源 |
try{
}catch( 异常类型 异常名称1){
}catch(异常类型 异常名称2){
}
finally{
}
tips:
关键字 | 作用 |
---|---|
throw | 在方法内 |
throws | 在声明方法时 |
public void 方法名(形参表) throws 异常类型{
//代码块
throw new 异常类型();
}
tips:
Java内置异常类已经可以处理大部分情况,但用户可以通过继承Exception类来自定义异常。
自定义异常类步骤:
1)创建自定义异常类
2)在方法中通过throw抛出异常对象
3)如果在抛出异常的方法中处理异常,则使用try catch语句捕获处理;否则通过throws指明要抛出给方法调用者的异常
4)在方法调用处捕获并处理异常
example:
1)自定义异常类myException
public class myException extends Exception{
private int detail;
public myException(int detail) {
this.detail = detail;
}
public String toString(){
return "myException("+detail+")";
}
}
2)测试类test
public class test {
static void test(int a) throws myException{
System.out.println("传参为"+a);
if(a>10){
throw new myException(a);
}
System.out.println("ok");
}
public static void main(String[] args) {
try {
test(1);
} catch (myException e) {
System.out.println("myException=>"+e);
} finally {
}
}
}